import { uniqBy, cloneDeep } from 'lodash'
// import store from '@/store'
import tinymce from 'tinymce/tinymce'
import { nrEnStarter, nrZhStarter, nrSelector } from '@/constants/string'
import { sleep } from '@/utils/helpers'
/**
 * 编辑器的引用标准编号、引用标准内容修改
 * @param {*} editor
 */
export default function (editor) {
  /** 判断文档中相同引用的数量 */
  // function getSameRefs(code, version) {
  //   return getAllUniqueRefs()?.filter((i) => i?.refcode === code && i?.refversion === version)
  // }

  /** 移除除章标题和引导语外的引用段落内容 */
  function removeRefDom() {
    const doc = tinymce.activeEditor.getDoc()
    // 1. 引用文件
    // 1.0 保留本来的引导语
    const paraSelector = nrSelector + 'p[data-type="paragraph"]'
    const paras = editor.dom.select(paraSelector)
    const guideZh = paras.find((p) => p.innerText?.trim()?.startsWith(nrZhStarter))
    const guideEn = paras.find((p) => p.innerText?.trim()?.startsWith(nrEnStarter))
    //  1.1 先移除原来的内容
    editor.dom.remove(paras.filter((i) => i !== guideZh && i !== guideEn))
  }

  /**
   * 根据数据在引用文件章节插入段落内容
   * @param {*} list
   *  1. 当手动排序时，list有值
   *  2. 当新增或删除引用时，自动更新引用，list为undefined没有值，自动处理
   */
  function updateRefDom(list) {
    const refArr = list || getSortedRefs()

    // 1). 清理工作
    removeRefDom()

    // 2). 构建新的paragraph并插入到页面中
    const html = refArr.reduce((acc, i) => {
      const blockId = i.id?.replace(/[a-z0-9]{8}/, i.type === 'refdoc' ? 'blockdoc' : 'blockchp')
      const dataId = i.id?.replace(/[a-z0-9]{8}/, i.type === 'refdoc' ? 'refdocmt' : 'refchptr')
      return (
        acc +
        `<p contenteditable="false"
          data-type="paragraph"
          class="nr-para ref-link ${i.maincontentid && i.maincontentid !== 'null' ? '' : 'ref-disabled'}"
          data-id="${dataId}"
          data-source-id="${i.sourceId || i.id}"
          data-maincontentid="${i.maincontentid === 'null' ? '' : i.maincontentid}"
          data-refcontent="${i.refcontent}"
          data-refversion="${i.refversion}"
          data-refname="${i.refname}"
          data-refdate="${i.refdate}"
          data-refcode="${i.refcode}"
          data-block-id="${blockId}"
          data-link-url="${i.linkUrl || ''}"
          data-docno="${i.docno}">
          <span class="nr-code">${i.refcontent}</span>
          <span class="nr-name">${i.refname}</span>
        </p>`
      )
    }, '')
    const lastPara = editor.getDoc()?.querySelector(nrSelector + 'p:last-child')
    let newParas = editor.dom.createFragment(html)
    lastPara && editor.dom.insertAfter(newParas, lastPara)
  }

  editor.on('addNewRef', () => {
    updateRefDom()
  })

  editor.on('insertTerms', () => {
    updateRefDom()
  })

  editor.on('removeRef', async () => {
    await sleep()
    updateRefDom()
  })

  editor.on('updateRef', (params) => {
    updateRefDom(params.list)
  })
}

/** 不解析引用的页面或内容 */
const exclusive = [
  '.page-sheet.foreword', //前言
  '.page-sheet.introduction', // 引言
  '.page-sheet[data-content-page-type="normative_references"]', // 引用文件
  '.page-sheet [data-type="example"]', // 示例
  '.page-sheet [data-type="item_note"]', // 示例
  '.page-sheet [data-type="figure_note"]', // 图注
  '.page-sheet [data-type="figure_footnote"]', // 图脚注
  '.page-sheet [data-type="table_note"]', // 表注
  '.page-sheet [data-type="table_footnote"]', // 表脚注
  '.page-sheet [data-type="footnote"]' // 脚注
]

/** 解析除引用文件等页面外插入的引用文件（引用标准编号，引用标准内容） */
function getAllRefs() {
  const str = `#tinymce>.page-wrapper :not(${exclusive.join(',')})`
  const selector = `${str} span[data-type="refdoc"], ${str} span[data-type="refchapter"]`
  return tinymce.activeEditor.dom.select(selector).map((node) => ({ ...node.dataset }))
}

function getAllUniqueRefs() {
  return uniqBy(getAllRefs(), (i) => i.refcode + i.refversion)
}

/** 解析引用文件页面经过排序后的引用文件paragraph */
function getUsedRefs() {
  return tinymce.activeEditor.dom.select(nrSelector + 'p[data-block-id^="block"]').map((node) => ({ ...node.dataset }))
}

/** 重新整理后的引用：1. 已显示的仍优先显示 2. 未显示的添加到后面 */
export function getSortedRefs() {
  const allRefs = getAllRefs()
  const allUniqueRefs = getAllUniqueRefs() //全集
  const usedRefs = getUsedRefs() //引用文件页面显示的
  const existedRefs = usedRefs.filter((i) => {
    // 在引用文件页面存在且在全集中，取两个的交集
    return allUniqueRefs.some((o) => o.refcode === i.refcode && i.refversion === o.refversion)
  })

  const isolatedRefs = allUniqueRefs.filter((i) => {
    // 全集过滤已经在引用文件页中，没有排序的
    return !usedRefs.some((o) => o.refcode === i.refcode && i.refversion === o.refversion)
  })

  return cloneDeep([...existedRefs, ...isolatedRefs]).map((i) => {
    const sameRefs = allRefs.filter((o) => o.refcode === i.refcode && i.refversion === o.refversion)
    if (sameRefs.some((i) => i?.refcontent?.includes('版'))) {
      i.refcontent = `${i.refcode} ${i.refversion}版`
    } else if (sameRefs.every((i) => !i?.refcontent?.includes('版'))) {
      i.refcontent = i.refcode
    }
    return i
  })
}
